package com.example.arr;

/**
 * 子数组最大平均数
 * 给一个整数数组，找出平均数最大且长度为k的下标连续的子数组，并输出该最大平均数。
 * 输入: [1, 12, -5, -6, 50, 3], k = 4;
 * 输出: 12.75
 * 最大平均数: (12 - 5 - 6 + 50) / 4 = 12.75
 * 滑动窗口算法:
 * 利用双指针，指针的间隔是固定的
 * 和统计法:
 * 移动的时候只需要和 - 前面的数 + 后面的数
 */
public class AvgMax {
    /**
     * 子数组最大平均数
     * @param nums 数组
     * @param k 子数组长度
     * @return avg
     */
    private static double findMaxAverage(int[] nums, int k) {

        int sum = 0;
        int n = nums.length;
        // 先统计第一个窗口值
        for (int i = 0; i < k; i++) {
            sum += nums[i];
        }
        int max = sum;
        // 滑动
        for (int i = k; i < n; i++) {
            sum = sum - nums[i - k] + nums[i];
            max = Math.max(sum, max);
        }
        return 1.0 * max / k;
    }

    public static void main(String[] args) {

        System.out.println(findMaxAverage(new int[]{1, 12, -5, -6, 50, 3}, 4));

    }

}
